<?php

namespace app\api\controller\wanlshop;

use app\common\controller\Api;
use addons\wanlshop\library\WanlChat\WanlChat;
use addons\wanlshop\library\WanlPay\WanlPay;

use think\View;
use think\Log;

/**
 * WanlShop 回调接口
 */
class Callback extends Api
{
    protected $noNeedLogin = ['*'];
    protected $noNeedRight = ['*'];


    public function _initialize()
    {
        parent::_initialize();

    }

    /**
     * 接收快递100推送消息
     *
     * @ApiSummary  (WanlShop 快递接口-接收快递100推送消息)
     * @ApiMethod   (POST)
     *
     * @param string $status 物流状态 polling:监控中，shutdown:结束，abort:中止，updateall：重新推送
     * @param array $lastResult 最新物流动态
     */
    public function kuaidi()
    {
        //设置过滤方法
        $this->request->filter(['strip_tags']);
        if ($this->request->isPost()) {
            $kuaidi = model('app\api\model\wanlshop\KuaidiSub');
            $post = $this->request->post();
            // 接收消息
            try {
                $param = json_decode($post["param"], true);
                $status = $param['status']; // 状态 polling:监控中，shutdown:结束，abort:中止，updateall：重新推送
                $message = $param['lastResult']['message']; // 消息体
                $state = $param['lastResult']['state']; // 快递单当前状态，包括0在途，1揽收，2疑难，3签收，4退签，5派件，6退回，7转投
                $ischeck = $param['lastResult']['ischeck']; // 是否签收标记
                $nu = $param['lastResult']['nu']; // 快递单号
                $com = $param['lastResult']['com']; // 快递公司编码
                $data = $param['lastResult']['data']; // 数组，包含多个对象，每个对象字段如展开所示
                // 查询快递是否存在
                $express = $kuaidi->get(['express_no' => $nu]);
                if ($express) {
                    // 判断来源
                    if ($post["sign"] != strtoupper(md5($post["param"] . $express['sign']))) {
                        return json(["result" => false, "returnCode" => "405", "message" => "校验码错误"]);
                    }
                    // 更新数据
                    $express->message = $message;
                    $express->status = $status;
                    $express->state = $state;
                    $express->ischeck = $ischeck;
                    $express->com = $com;
                    $express->data = json_encode($data);
                    $express->save();
                    // 判断更新状态
                    if ($express) {
                        return json(["result" => true, "returnCode" => "200", "message" => "接收成功"]);
                    }
                } else {
                    return json(["result" => false, "returnCode" => "404", "message" => "快递单号不存在"]);
                }
            } catch (Exception $e) {
                return json(["result" => false, "returnCode" => "500", "message" => "服务器错误"]);
            }
        }
        return json(["result" => false, "returnCode" => "500", "message" => "非正常访问"]);
    }

    /**
     * 推流状态回调
     *
     * @ApiSummary  (WanlShop 直播接口-推流状态回调)
     * @ApiMethod   (POST)
     *
     * @param string $action 回调状态 publish / publish_done
     * @param string $ip 回调地址ip
     * @param string $id 推流流名
     * @param string $app 推流域名
     * @param string $appname 推流app名
     * @param string $time timestamp
     * @param string $usrargs 用户参数
     * @param string $node 内部节点ip
     */
    public function push($id, $action)
    {
        $row = model('app\api\model\wanlshop\Live')->get(['liveid' => $id]);
        $find = model('app\api\model\wanlshop\find\Find');
        if ($row) {
            if ($action == 'publish') {
                $this->sendLiveGroup($id, ['type' => 'publish']);
                $row->save(['state' => 1]);
                // 避免多次推流，检查是否存在多个
                $count = $find->where('live_id', $row['id'])->count();
                // 发布动态
                if ($count == 0) {
                    // 关联商品
                    $goods = model('app\api\model\wanlshop\Goods')
                        ->where('id', 'in', $row['goods_ids'])
                        ->limit(2)
                        ->select();
                    $image = [$row['image']];
                    foreach ($goods as $vo) {
                        $image[] = $vo['image'];
                    }
                    // 1.1.2升级
                    $shop = model('app\api\model\wanlshop\Shop')->get($row['shop_id']);
                    $user = model('app\api\model\wanlshop\find\User')->get([
                        'user_id' => $shop['user_id']
                    ]);
                    // 保存数据
                    $find->save([
                        'shop_id' => $shop['id'],
                        'user_id' => $shop['user_id'], // 1.1.2升级
                        'user_no' => $user['user_no'], // 1.1.2升级
                        'type' => 'live',
                        'goods_ids' => $row['goods_ids'],
                        'live_id' => $row['id'],
                        'content' => $row['content'],
                        'images' => implode(',', $image)
                    ]);
                }
            } else if ($action == 'publish_done') {
                $this->sendLiveGroup($id, ['type' => 'publish_done']);
                $row->save(['state' => 2]);
            }
        } else {
            $this->error(__('没有找到相关推流'));
        }

    }

    /**
     * 录制文件回调
     *
     * @ApiSummary  (WanlShop 直播接口-录制文件回调)
     * @ApiMethod   (POST)
     *
     * @param string $domain 回调状态 publish / publish_done
     * @param string $app 回调地址ip
     * @param string $stream 推流流名
     * ------------------------------------
     * @param string $event record_started/record_paused/record_resumed
     *-------------------------------------
     * @param string $uri 推流域名
     * @param string $duration 推流app名
     * @param string $start_time timestamp
     * @param string $stop_time 用户参数
     */
    public function record()
    {
        if ($this->request->isPost()) {
            $event = $this->request->post('event');
            $stream = $this->request->post('stream');
            $uri = $this->request->post('uri');

            if ($event == 'record_started') {
                // 录制开始
            } else if ($event == 'record_paused') {
                // 录制暂停
            } else if ($event == 'record_resumed') {
                // 录制继续
            } else {
                // 录制成功
                if ($uri && $stream) {
                    $config = get_addon_config('wanlshop');
                    $live = model('app\api\model\wanlshop\Live')
                        ->where('liveid', $stream)
                        ->find();
                    // 修改CND拼接域名 1.1.2升级
                    $live->save(['recordurl' => ($config['live']['sslSwitch'] == 'Y' ? 'https://' : 'http://') . $config['live']['liveCnd'] . '/' . $uri]);
                    // 修改发现状态 1.1.4升级
                    $find = model('app\api\model\wanlshop\find\Find')
                        ->where('live_id', $live['id'])
                        ->find();
                    if ($find) {
                        $find->save(['state' => 'normal']);
                    }
                } else {
                    $this->error(__('录制失败'));
                }
            }
        }
        $this->error(__('非正常访问'));
    }
    //file:///C:/Users/WanlShop/Desktop/wanlshop-1.1.3/application/api/controller/wanlshop/Callback.php

    /**
     * 安全审核
     *
     * @ApiSummary  (WanlShop 直播接口-安全审核)
     * @ApiMethod   (POST)
     *
     * @param string $DomainName 用户域名
     * @param string $AppName App名
     * @param string $StreamName 流名
     * @param string $OssEndpoint 存储对象 Endpoint
     * @param string $OssBucket 存储对象的 Bucket
     * @param string $OssObject 存储对象的文件名
     * @param array $Result 参数
     */
    public function detectporn($StreamName, $Result)
    {
        $res = $Result[0]['Result'][0];
        if ($res['Suggestion'] == 'block') { // 违规
            $live = model('app\api\model\wanlshop\Live')->get(['liveid' => $StreamName]);
            model('app\api\model\wanlshop\find\Find')->where(['live_id' => $live['id']])->delete();
            $live->save(['gestion' => $res['Scene'], 'state' => 3]);
            // 封禁直播间
            $this->sendLiveGroup($StreamName, ['type' => 'ban']);

        } else if ($res['Suggestion'] == 'review') { // 直播间存在违规
            $this->sendLiveGroup($StreamName, [
                'type' => 'review',
                'text' => '直播间存在违规，请主播及时更正'
            ]);
        }
    }

    /**
     * 视频点播回调
     *
     * @ApiSummary  (WanlShop 视频接口-视频点播回调)
     * @ApiMethod   (POST)
     *
     * https://help.aliyun.com/document_detail/55627.html
     */
    public function vod()
    {
        if ($this->request->isPost()) {
            $server = $this->request->server();
            $params = $this->request->post();
            $config = get_addon_config('wanlshop');
            if ($server['HTTP_X_VOD_SIGNATURE'] == md5($this->request->url(true) . '|' . $server['HTTP_X_VOD_TIMESTAMP'] . '|' . $config['video']['privateKey']) && $params['Status'] == 'success') {
                $data = [];
                $videoId = $params['EventType'] == 'AIMediaAuditComplete' ? $params['MediaId'] : $params['VideoId'];
                // 创建视频
                if ($params['EventType'] == 'FileUploadComplete') {
                    $video = model('app\api\model\wanlshop\Video');
                    $video->video_id = $videoId;
                    $video->state = 'screenshot';
                    $video->save();
                    // 发现更新条件
                    $data['state'] = 'screenshot';
                } else {
                    $videoData = model('app\api\model\wanlshop\Video')
                        ->where('video_id', $videoId)
                        ->find();
                    // 视频截图完成
                    if ($params['EventType'] == 'SnapshotComplete') {
                        $videoData->save([
                            'cover_url' => $params['CoverUrl'], // 封面图片地址
                            'snapshots' => $params['Snapshots'], // 截图列表---
                            'state' => 'transcoding'
                        ]);
                        // 发现更新条件
                        $data['images'] = implode(",", $params['Snapshots']);
                        $data['state'] = 'transcoding';
                    }
                    // 智能审核完成
                    if ($params['EventType'] == 'AIMediaAuditComplete') {
                        $state = 'pass';
                        // 发现更新条件
                        $complete = json_decode($params['Data'], true);
                        if ($complete['Suggestion'] == 'block') {
                            $state = 'hazard';
                            $data['state'] = $state;
                        } else {
                            $data['state'] = $state;
                        }
                        // 更新视频
                        $videoData->save([
                            'suggestion' => $complete['Suggestion'],
                            'state' => $state
                        ]);
                    }
                    // 视频转码完成
                    if ($params['EventType'] == 'TranscodeComplete') {
                        $stream = $params['StreamInfos'][0];
                        // 更新视频
                        $videoData->save([
                            'bitrate' => $stream['Bitrate'], // 视频流码率，单位：Kbps
                            'definition' => $stream['Definition'], // 视频流清晰度定义
                            'duration' => $stream['Duration'], // 视频流长度，单位：秒
                            'url' => $stream['FileUrl'], // 视频流的播放地址
                            'format' => $stream['Format'], // 视频流格式
                            'fps' => $stream['Fps'], // 视频流帧率，每秒多少帧
                            'height' => $stream['Height'], // 视频流高度，单位：px
                            'width' => $stream['Width'], // 视频流宽度，单位：px
                            'size' => $stream['Size'], // 视频流大小，单位：Byte
                            'fit' => $stream['Height'] > $stream['Width'] ? 'cover' : 'contain', // 视频的表现形式
                            'state' => 'normal'
                        ]);
                        // 发现更新条件
                        $data['state'] = 'normal';
                    }
                }
                // 查询FIND是否已存在
                $find = model('app\api\model\wanlshop\find\Find')
                    ->where('video_id', $videoId)
                    ->find();
                // 更新状态
                if ($find) {
                    if ($find['state'] == 'examine') {
                        $data['state'] = 'examine';
                    }
                    $find->save($data);
                }
                $this->success();
            }
        }
        $this->error(__('非正常访问'));
    }

    /**
     * 支付成功回调
     *
     * @ApiSummary  (WanlShop 支付接口-支付成功回调)
     * @ApiMethod   (POST)
     *
     */
    public function notify()
    {
        $s = $_SERVER['REQUEST_URI'];
        $arr = explode('/', $s);
        $type = $arr[count($arr) - 1];
        Log::log('notify支付回调1：type:' . $type);
        if (empty($type)) {
            $this->error(__('非正常访问'));
        }
        $wanlpay = new WanlPay($type);
        $result = $wanlpay->notify();
        if ($result['code'] == 200) {
            return $result['msg'];
        } else {
            Log::write($result, 'debug');
        }
    }

    /**
     * 支付成功回调
     *
     * @ApiSummary  (WanlShop 支付接口-支付成功回调)
     * @ApiMethod   (POST)
     *
     */
    public function notify_recharge($type)
    {
        if (empty($type)) {
            $this->error(__('非正常访问'));
        }
        $wanlpay = new WanlPay($type);
        $result = $wanlpay->notify_recharge();
        if ($result['code'] == 200) {
            return $result['msg'];
        } else {
            Log::write($result, 'debug');
        }
    }

    /**
     * 退款回调 1.1.5升级
     *
     * @ApiSummary  (WanlShop 支付接口-支付成功回调)
     * @ApiMethod   (POST)
     *
     */
    public function notify_refund($type)
    {
        if (empty($type)) {
            $this->error(__('非正常访问'));
        }
        $wanlpay = new WanlPay($type);
        $result = $wanlpay->notify_refund();
        if ($result['code'] == 200) {
            return $result['msg'];
        } else {
            Log::write($result, 'debug');
        }
    }

    /**
     * 发送直播群组消息
     * 内部方法
     */
    private function sendLiveGroup($group, $message)
    {
        $wanlchat = new WanlChat();
        $wanlchat->sendGroup($group, [
            'type' => 'live',
            'group' => $group,
            'form' => [
                'id' => 0,
                'nickname' => '系统'
            ],
            'message' => $message,
            'online' => 0,
            'like' => 0
        ]);
    }
}
	
	
	
	